#include <QApplication>
#include <QCommandLineParser>
#include <QCommandLineOption>

#include "logging/logger.h"
#include "client/client.h"
#include "client/ui/clientwindow.h"
#include "server/server.h"
#include "server/serverui.h"
#include "network/lanservice.h"
#include <QFile>
#include <QFileInfo>
#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    a.setApplicationName("Hand-in-Hand");
    a.setApplicationVersion("1.0.0");
    
    // 设置日志
    Logger *logger = Logger::getInstance();
    logger->setLogFile("hand_in_hand.log");
    logger->setLogLevel(LogLevel::Debug);
    
    LOG_INFO("应用程序启动");
    
    // 命令行参数解析
    QCommandLineParser parser;
    parser.setApplicationDescription("远程桌面控制软件");
    parser.addHelpOption();
    parser.addVersionOption();
    
    // 添加模式选项
    QCommandLineOption serverOption(QStringList() << "s" << "server", "以服务端模式运行");
    QCommandLineOption clientOption(QStringList() << "c" << "client", "以客户端模式运行");
    QCommandLineOption portOption(QStringList() << "p" << "port", "指定监听端口", "port", "5900");
    QCommandLineOption hostOption(QStringList() << "h" << "host", "指定连接主机", "host", "localhost");
    QCommandLineOption noGuiOption(QStringList() << "n" << "no-gui", "不使用图形界面");
    QCommandLineOption lanDiscoveryOption(QStringList() << "l" << "lan-discovery", "启用局域网发现服务");
    QCommandLineOption serverNameOption(QStringList() << "name", "设置服务器名称", "name");
    
    parser.addOption(serverOption);
    parser.addOption(clientOption);
    parser.addOption(portOption);
    parser.addOption(hostOption);
    parser.addOption(noGuiOption);
    parser.addOption(lanDiscoveryOption);
    parser.addOption(serverNameOption);
    
    parser.process(a);
    
    // 根据命令行参数决定运行模式
    bool isServer = parser.isSet(serverOption);
    bool isClient = parser.isSet(clientOption);
    bool useGui = !parser.isSet(noGuiOption);
    bool useLanDiscovery = parser.isSet(lanDiscoveryOption);
    
    if (!isServer && !isClient) {
        // 默认作为客户端运行
        isClient = true;
//       isServer = true;
    }
    
    quint16 port = parser.value(portOption).toUShort();
    QString host = parser.value(hostOption);
    QString serverName = parser.value(serverNameOption);
    
    if (isServer) {
        LOG_INFO("以服务端模式启动");
        
        if (useGui) {
            // 使用图形界面运行服务端
            ServerUI serverUI;
            serverUI.show();
            
            return a.exec();
        } else {
            // 不使用图形界面，直接启动服务
            Server server;
            
            // 设置服务器名称
            if (!serverName.isEmpty()) {
                server.setServerName(serverName);
            }
            
            // 设置是否启用局域网发现
            server.enableLANDiscovery(useLanDiscovery);
            
            if (server.start(port)) {
                LOG_INFO(QString("服务器启动成功，监听端口: %1").arg(port));
            } else {
                LOG_ERROR(QString("服务器启动失败，端口: %1").arg(port));
                return 1;
            }
            
            return a.exec();
        }
    } else {
        LOG_INFO("以客户端模式启动");
        
        // 创建客户端窗口
        ClientWindow clientWindow;
        clientWindow.show();
        
        // 如果指定了主机和端口，则自动连接
        if (!host.isEmpty() && port > 0) {
            clientWindow.connectToServer(host, port);
        }
        
        return a.exec();
    }
} 
